// import { Deque, Queue } from './Queue'
const { Deque, Queue } = require('./Queue')

/**
 * 循环队列——击鼓传花游戏
 * 在这个游戏中，孩子们围成一个圆圈，把花尽快地传递给旁边的人。某一时刻传花停止，
 * 这个时候花在谁手里，谁就退出圆圈、结束游戏。重复这个过程，直到只剩一个孩子（胜者）。
 * @param elementList
 * @param num
 * @returns {{eliminated: *[], winner: (*|undefined)}}
 */
function hotPotato(elementList, num) {
  const queue = new Queue()
  const eliminatedList = []

  for (let i = 0; i < elementList.length; i++) {
    queue.enqueue(elementList[i])
  }

  while (queue.size() > 1) {
    for (let i = 0; i < num; i++) {
      queue.enqueue(queue.dequeue())
    }
    eliminatedList.push(queue.dequeue())
  }

  return {
    eliminated: eliminatedList,
    winner: queue.dequeue()
  }
}

// const names = ['John', 'Jack', 'Camila', 'Ingrid', 'Carl']
// const result = hotPotato(names, 7)
//
// result.eliminated.forEach(name => {
//   console.log(`${name}在击鼓传华游戏中被淘汰了`)
// })
//
// console.log(`胜利者：${result.winner}`)

/**
 * 利用双端队列检查字符串是否是回文
 * 更简洁的算法是把字符串翻转对比和源字符串是否相等就可以
 * @param aString
 * @returns {boolean}
 */
function palindromeChecker(aString) {
  if (!aString) {
    return false
  }

  const deque = new Deque()
  // 转成小写，同时移除所有空格
  const lowerString = aString
    .toLocaleString()
    .split(' ')
    .join('')
  let isEqual = true
  let firstChar, lastChar

  for (let i = 0; i < lowerString.length; i++) {
    deque.enqueue(lowerString.charAt(i))
  }

  while (deque.size() > 1 && isEqual) {
    firstChar = deque.dequeue()
    lastChar = deque.removeBack()
    if (firstChar !== lastChar) {
      isEqual = false
    }
  }

  return isEqual
}

// console.log(palindromeChecker('a'))
// console.log(palindromeChecker('aba'))
// console.log(palindromeChecker('abaa'))
